#ifndef __BSP_DAC_H__
#define __BSP_DAC_H__

#include "bsp_cfg.h"

#include <stdint.h>

typedef struct
{
    uint16_t Xdac;
    uint8_t  Kop;
    uint16_t Xadc_min;
    uint16_t Xadc_max;
} CFG_Table;

#if (defined(HARD_VERSION_V1) || defined(HARD_VERSION_V2))
#define DAC_GPIO_MODE FL_GPIO_MODE_ANALOG

#elif defined(HARD_VERSION_V2_1)
#define DAC_GPIO_MODE FL_GPIO_MODE_OUTPUT

#endif

#define RES_Feedback      (4700.f) // 4.7KΩ
#define RES_VALUE_INVALID (650000) // 阻值大于该值时认为无效，
#define RES_VALUE_MIN_ERR (100)    // 阻值小于该值时认为无效

#if defined(HARD_VERSION_V1)       // TODO:硬件版本1参数
#define DAC_VALUE_INIT (1000)      //)(2000)
#define RES_VALUE_MAX  (650000)
#define RES_CAL(Xdac, Xadc)                                                                                \
    ((Xadc <= Xdac) ? RES_VALUE_INVALID : ((Xdac * RES_Feedback) / (Xadc - Xdac) - 100))

#elif defined(HARD_VERSION_V2) // 硬件版本2参数
#define DAC_VALUE_INIT (3250)  //(1000)//)(2000)
#define RES_VALUE_MAX  (150000)
#define RES_CAL(Xdac, Xadc)                                                                                \
    ((Xadc >= Xdac) ? RES_VALUE_INVALID : ((Xadc * RES_Feedback) / (Xdac - Xadc) - 100))
#elif defined(HARD_VERSION_V2_1)  // 硬件版本2参数

#define RES_VALUE_MAX       (150000)
// #define V_ADC_VAL     (4.5)      // ADC参考电压使用Vref配置电压
#define V_ADC_VAL           (5.0) // ADC参考电压使用VDD
#define RES_CAL(Xdac, Xadc) ((((5 * 4095) / (V_ADC_VAL * Xadc) - 1) * RES_Feedback) - 100)
// #define RES_CAL(Xdac, Xadc) (((4095.f / (Xadc) - 1) * RES_Feedback - 100)) //ADC参考源VDD

#else
#error hard is not config!
#endif

void    Bsp_DAC_init(void);
void    Dac_value_init(void);
uint8_t DAC_value_adj(uint16_t Xadc, float *res_val);
#endif
